import os
from jili.core.printlog import print
# 屏蔽 Git 相关监控
os.environ['WANDB_DISABLE_CODE'] = 'true'
os.environ['WANDB_DISABLE_GPU'] = 'true'
os.environ['WANDB_DISABLE_GIT'] = 'true'
os.environ['WANDB_DISABLE_NETWORK_ALERT'] = 'true'
os.environ["WANDB_DISABLE_PROCESS"] = "true"  # 禁止采集进程树（依赖 disable_meta=False 时单独禁用）
os.environ["WANDB_SILENT"] = "true"
os.environ["WANDB_DISABLE_METADATA"] = "true"   # 等同于 disable_meta=True
os.environ["WANDB_DISABLE_NETWORK"] = "true"    # 等同于 disable_network=True
import wandb
from jili.tool.pcinfo import get_pcname
from jili.tool.filetool import get_run_filename
class wandb_tool:#nchjili-jili
    def __init__(self,rooturl=None,id=None,entity="nchjili-jili",project="research",resume=True,config_info={}):
        if id is None:
            id=get_pcname()
        if rooturl is not None:
            if not os.path.exists(rooturl):
                os.makedirs(rooturl)
        """
        参数名	作用	示例值	类型
        _disable_stats	禁用所有系统监控（True/False）	True	Boolean
        _stats_disable	禁用指定指标类（支持通配符）	["cpu_", "gpu_"]	List[str]
        _stats_sample_rate_seconds	系统指标采样频率	60 (秒)	Int/None
        W&B 在初始化 (wandb.init()) 后会自动收集以下 硬件与系统级数据，无需用户手动配置：
        1. GPU 监控
        gpu/usage：GPU 使用率百分比（按设备分列，如 gpu:0）
        gpu/memory：显存占用量（单位：MB）
        gpu/power：功耗（仅部分 GPU 支持）
        gpu/temperature：温度（仅部分 GPU 支持）
        2. CPU 监控
        cpu/usage：整体 CPU 使用率（总占比）
        cpu/usage_per_core：每个逻辑核心的使用率
        cpu/memory：物理内存使用量（单位：GB）
        swap/memory：Swap 交换空间使用量
        3. 网络与磁盘（需环境支持）
        network/sent：网络发送速度（单位：MB/s）
        network/received：网络接收速度
        disk/usage：磁盘读写速度（需权限）
        4. 进程状态
        proc/cpu/threads：进程的线程数
        proc/memory/rss：进程实际内存占用（Resident Set Size）
        """
        # 通过 settings 关闭（推荐直接写在 init 中）
        # settings = wandb.Settings(_disable_stats=True)
        # # 通配符匹配所有GPU相关指标
        # wandb.api.settings
        # settings = wandb.Settings(**settings)
        settings = wandb.Settings(disable_code=True,disable_git=True,
                                  save_code=False,  # 禁用代码保存d
                                  init_timeout=300
                                  # start_method="thread"  # 加速初始化（避免 fork 进程）
                                  # sync_tensorboard=False
                                  # _stats={
                                  #     "system": []  # 关闭所有系统指标（不采集任何数据）
                                  #     # 或精确控制：
                                  #     # "system": ["cpu"],  # 只采集 CPU 数据
                                  #     system": ["cpu", "memory"],  # 采集 CPU 和内存
                                  # }
            # _disable_stats=True,
            # _stats_sample_rate_seconds=10,  # 降低采样频率
            # _disable_meta = True,  # 停止收集系统元信息（Python版本等）
        )
        #采样频率与重置
        if config_info:
            if rooturl is None:
                self.run = wandb.init(entity=entity, project=project, id=id, resume=resume,
                                      settings=settings, config=config_info)  # 通配符匹配所有GPU相关指标
            else:
                self.run = wandb.init(dir=rooturl,entity=entity,project=project,id=id,resume=resume,settings=settings,config=config_info)  # 通配符匹配所有GPU相关指标
        else:
            if rooturl is None:
                self.run = wandb.init(entity=entity,project=project,id=id,resume=resume,settings=settings)  # 通配符匹配所有GPU相关指标
            else:
                self.run = wandb.init(dir=rooturl,entity=entity,project=project,id=id,resume=resume,settings=settings)  # 通配符匹配所有GPU相关指标
        self.fname=get_run_filename()
        # 或者在初始化后，手动停止某些监控
        # wandb.wa(False)  # 停止模型监控
        print("sys","wandb init")
    def log(self,info,addfname=True):
        info0={}
        if addfname:
            for k,v in info.items():
                info0[self.fname+"_"+k]=v
        else:
            info0=info
        self.run.log(info0)
    def close(self):
        self.run.finish()


if __name__=="__main__":
    import datetime
    from jili.tool.filetool import get_run_filename
    t0=datetime.datetime.now()

    wandb_tool0=wandb_tool(rooturl=r"G:/log",config_info={"base_url":"D:/price_rq0","range":[0,2000]})
    t1=datetime.datetime.now()
    print(t1 - t0)
    run_filename = get_run_filename()
    for i in range(100):
        i=i+1
        wandb_tool0.log({run_filename+"_byobj":i,run_filename+"_progress%":100*i/100})
    t2 = datetime.datetime.now()
    wandb_tool0.close()
    print(t1-t0,t2-t1)